package com.tjcd.project.library_base.common.utils;

import com.tjcd.project.library_base.common.utils.other.ValueChangeObserver;

import io.reactivex.rxjava3.subjects.BehaviorSubject;

/**
 * @Author jiangKunKun
 * @CreateDate 2024/11/26
 * @Description
 * @SpittingGrooves
 */
public class ValueChangeUtils {

    private ValueChangeUtils() {
        // 防止实例化
    }

    /**
     * 第一使用权
     * 创建一个新的 BehaviorSubject
     *
     * @param <T>         泛型类型
     * @param defaultValue 默认值
     * @return BehaviorSubject
     */
    public static <T> BehaviorSubject<T> create(T defaultValue) {
        return BehaviorSubject.createDefault(defaultValue);
    }

    /**
     * 设置值
     *
     * @param subject 主题
     * @param value   新值
     * @param <T>     泛型类型
     */
    public static <T> void setValue(BehaviorSubject<T> subject, T value) {
        subject.onNext(value);
    }

    /**
     * 创建一个新的值变化观察者
     *
     * @param <T>         泛型类型
     * @param defaultValue 默认值
     * @return 值变化观察者
     */
    public static <T> ValueChangeObserver<T> createObserver(T defaultValue) {
        return new ValueChangeObserver<>(defaultValue);
    }

    /**
     * 获取BehaviorSubject
     *
     * @param observer 观察者
     * @param <T>      泛型类型
     * @return BehaviorSubject
     */
    public static <T> BehaviorSubject<T> getSubject(ValueChangeObserver<T> observer) {
        return observer.getSubject();
    }

    /**
     // 可扩展
     // 创建 ValueChangeObserver 并设置初始值
     ValueChangeObserver<String> observer = ValueChangeUtils.createObserver("Initial Value");

     // 订阅值变化
     Disposable disposable = observer.getSubject().subscribe(value -> {
     System.out.println("Value changed to: " + value);
     });

     // 设置新值
     observer.setValue("New Value");

     // 在适当的地方取消订阅
     disposable.dispose();

     =======================================

     // 简单的直接使用
     // 直接创建 BehaviorSubject 并设置初始值
     BehaviorSubject<String> subject = ValueChangeUtils.create("Another Initial Value");

     // 订阅值变化
     Disposable disposable = subject.subscribe(value -> {
     System.out.println("Direct BehaviorSubject value changed to: " + value);
     });

     // 设置新值
     ValueChangeUtils.setValue(subject, "Another New Value");

     // 在适当的地方取消订阅
     disposable.dispose();
     */
}
